package com.lyxs916.network;


import java.util.Map;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
import rx.Observable;
import rx.Subscriber;

/**
 * 说明:网络请求的接口
 * 作者： 杨阳; 创建于：  2017-06-07  17:19
 */
public interface ApiService {

    /**
     * post 有参数的请求
     *
     * @param path 请求路径
     * @param maps 参数
     * @return Observable
     */
    @FormUrlEncoded
    @POST("{path}")
    Observable<ResponseBody> executePost(
            @Path(value = "path", encoded = true) String path,
            @FieldMap Map<String, String> maps
    );


    /**
     * get 有参数的请求
     *
     * @param path 请求路径
     * @param maps 参数
     * @return Observable
     */
    @GET("{path}")
    Observable<ResponseBody> executeGet(
            @Path(value = "path", encoded = true) String path,
            @QueryMap Map<String, String> maps);


    /**
     * post 无参数的请求
     *
     * @param path 请求路径
     * @return Observable
     */
    @FormUrlEncoded
    @POST("{path}")
    Observable<ResponseBody> executePost(
            @Path(value = "path", encoded = true) String path
    );

    /**
     * get 无参数的请求
     *
     * @param path 请求路径
     * @return Observable
     */
    @GET("{path}")
    Observable<ResponseBody> executeGet(
            @Path(value = "path", encoded = true) String path
    );

    /**
     * post 有参数的请求，上传文件
     *
     * @param path 请求路径
     * @param maps 文件
     * @return Observable
     */
    @Multipart
    @POST("{path}")
    Observable<ResponseBody> uploadFiles(
            @Path(value = "path", encoded = true) String path,
            @PartMap() Map<String, RequestBody> maps);

    /**
     * @param fileUrl 下载的地址
     * @param subscriber
     * @return Observable
     */
    @Streaming
    @GET
    Observable<ResponseBody> downloadFile(@Url String fileUrl, Subscriber<ResponseBody> subscriber);


}
